/**
 * 麦克风SDK事件系统模块
 * 提供事件发布/订阅功能
 */

/**
 * 事件类型常量
 */
export const EventTypes = {
  MICROPHONE_STATUS: 'microphoneStatus',
  AUDIO_LEVEL: 'audioLevel',
  PERMISSION: 'permission',
  PLAYBACK_STATUS: 'playbackStatus',
  MICROPHONE_LIST: 'microphoneList',
  ERROR: 'error'
};

/**
 * 事件发射器类
 * 实现简单的事件发布/订阅模式
 */
export class EventEmitter {
  constructor() {
    this.events = {};
    this.eventId = 0;
  }

  /**
   * 订阅事件
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   * @returns {Function} 取消订阅的函数
   */
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = {};
    }
    
    const id = this.eventId++;
    this.events[event][id] = callback;
    
    // 返回取消订阅的函数
    return () => {
      if (this.events[event] && this.events[event][id]) {
        delete this.events[event][id];
      }
    };
  }

  /**
   * 发布事件
   * @param {string} event - 事件名称
   * @param {...any} args - 传递给回调的参数
   */
  emit(event, ...args) {
    if (!this.events[event]) return;
    
    Object.values(this.events[event]).forEach(callback => {
      try {
        callback(...args);
      } catch (error) {
        console.error(`事件处理器错误 (${event}):`, error);
      }
    });
  }

  /**
   * 移除特定事件的所有监听器
   * @param {string} event - 事件名称
   */
  removeAllListeners(event) {
    if (event) {
      delete this.events[event];
    } else {
      this.events = {};
    }
  }

  /**
   * 获取特定事件的监听器数量
   * @param {string} event - 事件名称
   * @returns {number} 监听器数量
   */
  listenerCount(event) {
    if (!this.events[event]) return 0;
    return Object.keys(this.events[event]).length;
  }
}

// 创建并导出事件发射器实例
const eventEmitter = new EventEmitter();
export default eventEmitter;

/**
 * 订阅麦克风状态变化事件
 * @param {Function} callback - 回调函数，接收状态对象
 * @returns {Function} 取消订阅的函数
 */
export function onMicrophoneStatusChange(callback) {
  return eventEmitter.on(EventTypes.MICROPHONE_STATUS, callback);
}

/**
 * 订阅音频电平变化事件
 * @param {Function} callback - 回调函数，接收音频电平值(0-1)
 * @returns {Function} 取消订阅的函数
 */
export function onAudioLevelChange(callback) {
  return eventEmitter.on(EventTypes.AUDIO_LEVEL, callback);
}

/**
 * 订阅权限变化事件
 * @param {Function} callback - 回调函数，接收权限状态(boolean)
 * @returns {Function} 取消订阅的函数
 */
export function onPermissionChange(callback) {
  return eventEmitter.on(EventTypes.PERMISSION, callback);
}

/**
 * 订阅回放状态变化事件
 * @param {Function} callback - 回调函数，接收回放状态(boolean)
 * @returns {Function} 取消订阅的函数
 */
export function onPlaybackStatusChange(callback) {
  return eventEmitter.on(EventTypes.PLAYBACK_STATUS, callback);
}

/**
 * 订阅麦克风列表变化事件
 * @param {Function} callback - 回调函数，接收麦克风设备列表
 * @returns {Function} 取消订阅的函数
 */
export function onMicrophoneListChange(callback) {
  return eventEmitter.on(EventTypes.MICROPHONE_LIST, callback);
}

/**
 * 订阅错误事件
 * @param {Function} callback - 回调函数，接收错误对象
 * @returns {Function} 取消订阅的函数
 */
export function onError(callback) {
  return eventEmitter.on(EventTypes.ERROR, callback);
} 